<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>%Examples{'IO'} = open('Perl6');</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="050528.html">Google Print</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES11.html">class Examples11 is Perl6 { ... }</a></p>
<h1>%Examples{'IO'} = open('Perl6');</h1>
<div class='content'>
<p>Category: <a href='Perl6.html'>Perl6</a> &nbsp; Keywords: <b>IO Perl6</b></p><h3>my shoulder</h3>
Yap, I'm just back from the Shanghai pm meeting. great meeting and lovely guys. :)

<h3>simple</h3>
因为 FILEHANDLE 将不再存在，而 Perl 6 中有一类型叫做 IO,所以我们一般用如下方法（IO 对象的方法）读取文件：
<pre>my $out = open(">$filename"); # $out 的类型就是 IO, 下同
my $in = open($filename);
my $append = open(">>$filename");</pre>
读进来后我们将不用 <> 来获取行，而用如下方法获取：
<pre>my $line1 = readline($in); # 要读取所有行的话将 $line1 改为 @line1。下同
my $line2 = $in.readline();
my $line3 = = $in; # 注意不是 ==</pre>
这是三种读取的方法，下面是简单的写入方法：
<pre>$out.print("... Its not over yet!\n"); # 追加的写入是一样的</pre>
关闭自然是：
<pre>$in.close;</pre>

<h3>for, while</h3>
一般推荐用 for 来写：
<pre>for (=$fh) -> $line { # 或 for =$fh -> $line { 省略了那括号</pre>
while 的写法如下：
<pre>my $line; # 必须声明 $line
while ($line = = $fh) {</pre>
<p>相比而言，for 有额外的好处就是限制了 $line 参数的作用域到它所属的块。（ while 声明
的 $line 在块结束后还是继续存在的。）</p>

注意：下面的写法将使 $line 为整个文件的内容：
<pre>while =$*IN -> $line {</pre>
<p>这是因为 = 在标量上下文里会做一 slurp, 将整个文件读取进来。</p>

<h3>slurp</h3>
<pre>my $content = slurp $filename;</pre>
$content 将是整个文件的内容。

<h3>DATA</h3>
我们在 Perl 5 中文件里可以有一句柄为 __DATA__, 在 Perl 6 中我们可以有很多个 DATA。语法结构是下面这样子，但我不确定以后会不会更改（pugs 目前还没实现这一功能）。
<pre><code>=begin DATA LABEL1
LABEL1.1
LABEL1.2
LABEL1.3
=end DATA

=begin DATA LABEL2
LABEL2.1
LABEL2.2
=end DATA

# %=DATA&lt;LABEL1>[0] 为 LABEL1.1
# 我们还可以缩写为 $=LABEL2[1] 为 LABEL2.2</code></pre>

<h3>prompts</h3>
在 Perl 5 中命令行参数获取我们一般用
<pre>print "输入您的用户名";
$user = <>;</pre>
Perl 6 中我们将用 prompts 命令行提示来获取：
<pre>$ARGS prompts("Search? "); # Perl 6
while (<$ARGS>) {</pre>
但这也不是定下来了，所以先不详细介绍，等定下来了我再补充说明。

<h3>句柄参数</h3>
我在 <a href='Perl6_ES3.html'>my Perl6 @Examples[3]</a> 介绍过类型在子程序中的应用。<br />
在 Perl 5 中一般用 \*FH 来传递句柄，这不是很方便而且 Perl 6 中也不再有 * 这种 typeglob 类型。新的传递方法将简单的使用类型 IO, 结合上面的写个简单完整例子：
<pre>my $fh = open('>temp') or die $!;
&append_2($fh, "line1");
&append_2($fh, "line2");
$fh.close;

sub append_2(IO $fh, $str) {
    $fh.print("$str in subroutine\n");
}

# file:temp
# line1 in subroutine
# line2 in subroutine</pre>

<h3>DIR</h3>
因为在 Apocalypse, Synopsis 里都没有提到操作 DIR 的事，所以默认跟 Perl 5 是一样的。
<pre>my IO $dir;
opendir($dir, '.');
my @files = readdir($dir);
close($dir);</pre>
我认为 OO 方式也是可以的。比如 $dir.opendir('.'); $dir.readdir(); $dir.close();

<h3>To be continued</h3>
wait for a while. :)</div>
<p><&lt;Previous: <a href="050528.html">Google Print</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES11.html">class Examples11 is Perl6 { ... }</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=%25Examples%7B'IO'%7D%20=%20open('Perl6');&url=http://www.fayland.org/journal/Perl6_ES10.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='050307.html'>The project of Synopsis localization</a> < <span class='digit'>2005-03-07 22:55:26</span> ></li><li><a href='Perl6_ES14.html'>has $.Examples14 handles 'Perl6';</a> < <span class='digit'>2005-06-02 01:38:59</span> ></li><li><a href='Perl6_ES9.html'>Perl6 | Examples & 9 ^ junction</a> < <span class='digit'>2005-05-26 12:35:29</span> ></li><li><a href='Catalyst_Session_Win32.html'>Catalyst 在 Win32 下的 Session</a> < <span class='digit'>2005-09-29 11:08:04</span> ></li><li><a href='Template_Configuration.html'>Template Toolkit 的配置选项</a> < <span class='digit'>2005-10-24 20:23:23</span> ></li><li><a href='Proxy_automatic_configura.html'>自动代理配置</a> < <span class='digit'>2005-11-20 14:26:15</span> ></li><li><a href='C3_method_resolution_orde.html'>C3 method resolution order</a> < <span class='digit'>2005-11-25 17:36:06</span> ></li><li><a href='svk_notes.html'>svk 的一些使用纪录</a> < <span class='digit'>2005-12-03 00:45:11</span> ></li></ul>
Created on <span class="digit">2005-05-30 00:24:01</span>, Last modified on <span class="digit">2005-05-31 20:03:05</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>